{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": false
   },
   "source": [
    "### 之前看到一位兄dei搞cxk的人体关键点检测挺有趣，想着是不是可以基于人体关键点检测，加个一个差异计算可以评估青你选手主题曲的动作标准度。也不知道行不行先试试！\n",
    "## 目的：\n",
    "- 由于本人沉迷青你无法自拔，pick谢可寅跟安崎，想通过AI各种手段，包括NLP、CV等，看看我pick的选手是不是既有实力又有观众缘\n",
    "- 说到实力，我打算使用关键点检测的模型，跟踪两位选手的骨骼走向，以安崎为标准，谢可寅为测试者，通过对比舞蹈得出实力评估值0-1\n",
    "- 然后观众缘，主要通过微博的评论，经过统计与情感分析获得选手的主要关注内容以及大众对她的好感度\n",
    "- 最后，据说风格迁移模型搞出来挺炫酷的，我也掺一脚\n",
    "\n",
    "## 具体思路：\n",
    "\n",
    "主要以安崎小甜心的主题曲直拍视频作为标准视频，谢可寅shaking的主题曲直拍视频作为测试视频\n",
    "\n",
    "1. 将标准视频进行爬取，将视频逐帧读取成图片;\n",
    "2. 由于图片背景光线不太利于关键点捕抓，利用deeplabv3p_xception65_humanseg进行抠图处理;\n",
    "3. 基于pose_resnet50_mpii模型进行关键点检测并存储检测结果;\n",
    "4. 然后对测试视频作同样处理存储检测结果;\n",
    "5. 基于单通道的直方图对标准检测结果集以及测试检测结果集进行图片相似度计算，取结果均值作为选手的主题曲实力值;\n",
    "6. 将获取的实力值合成到选手图片并输出\n",
    "7. 爬取微博测试选手相关评论，统计高频词输出图\n",
    "8. 对评论进行情感分析，输出总体评论积极与消极的对比饼图 \n",
    "\n",
    "\n",
    "![示例](https://ai-studio-static-online.cdn.bcebos.com/2cc2c32beba74d638cc6a717bb58951b0dfe93bb1aa34117808838cc631aee23)![](https://ai-studio-static-online.cdn.bcebos.com/b9837de36aa348e695a6a5bea7a26666c85836428ab0429a8a33d6ab1ed7a830)\n",
    "\n",
    "\n",
    "![](https://ai-studio-static-online.cdn.bcebos.com/c6b78c1b6688474e8c76cf93b64dbaa172021ef638ed48dcadc09d00c9cff9e8)\n",
    "\n",
    "### 风格迁移\n",
    "实现原视频画面风格转换成水墨风格，对视频的每一帧画面进行风格迁移处理，然后重新合成视频加上原视频音频后，重新输出\n",
    "\n",
    "![](https://ai-studio-static-online.cdn.bcebos.com/0111c40988394fbbaf9c08702a00bf97a3f4de017f8a46c78f66894f2424ba1c) ![](https://ai-studio-static-online.cdn.bcebos.com/b60066bb579a44c1b2ca568499c6e0812688a493df6e4c8fa8e1c8f83a5bd783)\n",
    "\n",
    "\n",
    "**成片**\n",
    "\n",
    "![](https://ai-studio-static-online.cdn.bcebos.com/35ec87217aa644e3b53200e5fd5ef2b4995bc319df3b49f78976c92675034c60)\n",
    "\n",
    "\n",
    "\n",
    "\n",
    "\n",
    "\n",
    " \n",
    "\n",
    "\n",
    "\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": true
   },
   "source": [
    "# 引入库准备"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Looking in indexes: https://pypi.mirrors.ustc.edu.cn/simple/\n",
      "Collecting paddlepaddle\n",
      "\u001b[?25l  Downloading https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/8d/6d/f69ea6f6df82cb2d6dcb768265509be95df34057bcdf8b6ec44fbeee3941/paddlepaddle-1.7.2-cp37-cp37m-manylinux1_x86_64.whl (103.3MB)\n",
      "\u001b[K     |████████████████████████████████| 103.3MB 298kB/s ta 0:00:014\n",
      "\u001b[?25hRequirement already satisfied, skipping upgrade: protobuf>=3.1.0 in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from paddlepaddle) (3.10.0)\n",
      "Requirement already satisfied, skipping upgrade: pyyaml in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from paddlepaddle) (5.1.2)\n",
      "Requirement already satisfied, skipping upgrade: objgraph in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from paddlepaddle) (3.4.1)\n",
      "Requirement already satisfied, skipping upgrade: six in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from paddlepaddle) (1.12.0)\n",
      "Requirement already satisfied, skipping upgrade: graphviz in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from paddlepaddle) (0.13)\n",
      "Requirement already satisfied, skipping upgrade: funcsigs in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from paddlepaddle) (1.0.2)\n",
      "Requirement already satisfied, skipping upgrade: requests>=2.20.0 in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from paddlepaddle) (2.22.0)\n",
      "Requirement already satisfied, skipping upgrade: rarfile in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from paddlepaddle) (3.1)\n",
      "Requirement already satisfied, skipping upgrade: scipy<=1.3.1; python_version >= \"3.5\" in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from paddlepaddle) (1.3.0)\n",
      "Requirement already satisfied, skipping upgrade: nltk; python_version >= \"3.5\" in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from paddlepaddle) (3.4.5)\n",
      "Requirement already satisfied, skipping upgrade: opencv-python in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from paddlepaddle) (4.1.1.26)\n",
      "Requirement already satisfied, skipping upgrade: prettytable in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from paddlepaddle) (0.7.2)\n",
      "Requirement already satisfied, skipping upgrade: matplotlib; python_version >= \"3.6\" in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from paddlepaddle) (2.2.3)\n",
      "Requirement already satisfied, skipping upgrade: Pillow in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from paddlepaddle) (6.2.0)\n",
      "Requirement already satisfied, skipping upgrade: decorator in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from paddlepaddle) (4.4.0)\n",
      "Requirement already satisfied, skipping upgrade: numpy>=1.12; python_version >= \"3.5\" in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from paddlepaddle) (1.16.4)\n",
      "Requirement already satisfied, skipping upgrade: setuptools in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from protobuf>=3.1.0->paddlepaddle) (41.4.0)\n",
      "Requirement already satisfied, skipping upgrade: chardet<3.1.0,>=3.0.2 in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from requests>=2.20.0->paddlepaddle) (3.0.4)\n",
      "Requirement already satisfied, skipping upgrade: certifi>=2017.4.17 in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from requests>=2.20.0->paddlepaddle) (2019.9.11)\n",
      "Requirement already satisfied, skipping upgrade: urllib3!=1.25.0,!=1.25.1,<1.26,>=1.21.1 in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from requests>=2.20.0->paddlepaddle) (1.25.6)\n",
      "Requirement already satisfied, skipping upgrade: idna<2.9,>=2.5 in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from requests>=2.20.0->paddlepaddle) (2.8)\n",
      "Requirement already satisfied, skipping upgrade: cycler>=0.10 in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from matplotlib; python_version >= \"3.6\"->paddlepaddle) (0.10.0)\n",
      "Requirement already satisfied, skipping upgrade: python-dateutil>=2.1 in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from matplotlib; python_version >= \"3.6\"->paddlepaddle) (2.8.0)\n",
      "Requirement already satisfied, skipping upgrade: kiwisolver>=1.0.1 in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from matplotlib; python_version >= \"3.6\"->paddlepaddle) (1.1.0)\n",
      "Requirement already satisfied, skipping upgrade: pytz in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from matplotlib; python_version >= \"3.6\"->paddlepaddle) (2019.3)\n",
      "Requirement already satisfied, skipping upgrade: pyparsing!=2.0.4,!=2.1.2,!=2.1.6,>=2.0.1 in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from matplotlib; python_version >= \"3.6\"->paddlepaddle) (2.4.2)\n",
      "Installing collected packages: paddlepaddle\n",
      "Successfully installed paddlepaddle-1.7.2\n",
      "Looking in indexes: https://pypi.mirrors.ustc.edu.cn/simple/\n",
      "Collecting paddlehub\n",
      "\u001b[33m  WARNING: Retrying (Retry(total=4, connect=None, read=None, redirect=None, status=None)) after connection broken by 'ReadTimeoutError(\"HTTPSConnectionPool(host='mirrors.ustc.edu.cn', port=443): Read timed out. (read timeout=15)\")': /pypi/web/simple/paddlehub/\u001b[0m\n",
      "\u001b[?25l  Downloading https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/6e/07/d4839d63853c01d2f9d040ff079e63e007c9e4084e74f447baf46b426811/paddlehub-1.6.2-py3-none-any.whl (207kB)\n",
      "\u001b[K     |████████████████████████████████| 215kB 4.4MB/s eta 0:00:01\n",
      "\u001b[?25hRequirement already satisfied, skipping upgrade: chardet==3.0.4 in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from paddlehub) (3.0.4)\n",
      "Requirement already satisfied, skipping upgrade: pre-commit in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from paddlehub) (1.21.0)\n",
      "Requirement already satisfied, skipping upgrade: Pillow in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from paddlehub) (6.2.0)\n",
      "Requirement already satisfied, skipping upgrade: flask>=1.1.0 in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from paddlehub) (1.1.1)\n",
      "Requirement already satisfied, skipping upgrade: tensorboard>=1.15 in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from paddlehub) (2.1.0)\n",
      "Requirement already satisfied, skipping upgrade: pandas; python_version >= \"3\" in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from paddlehub) (0.23.4)\n",
      "Requirement already satisfied, skipping upgrade: colorlog in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from paddlehub) (4.1.0)\n",
      "Requirement already satisfied, skipping upgrade: tb-paddle in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from paddlehub) (0.3.6)\n",
      "Requirement already satisfied, skipping upgrade: protobuf>=3.6.0 in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from paddlehub) (3.10.0)\n",
      "Requirement already satisfied, skipping upgrade: opencv-python in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from paddlehub) (4.1.1.26)\n",
      "Requirement already satisfied, skipping upgrade: numpy; python_version >= \"3\" in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from paddlehub) (1.16.4)\n",
      "Requirement already satisfied, skipping upgrade: cma==2.7.0 in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from paddlehub) (2.7.0)\n",
      "Requirement already satisfied, skipping upgrade: requests in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from paddlehub) (2.22.0)\n",
      "Requirement already satisfied, skipping upgrade: pyyaml in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from paddlehub) (5.1.2)\n",
      "Requirement already satisfied, skipping upgrade: six>=1.10.0 in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from paddlehub) (1.12.0)\n",
      "Requirement already satisfied, skipping upgrade: sentencepiece in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from paddlehub) (0.1.85)\n",
      "Requirement already satisfied, skipping upgrade: gunicorn>=19.10.0; sys_platform != \"win32\" in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from paddlehub) (20.0.4)\n",
      "Requirement already satisfied, skipping upgrade: nltk in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from paddlehub) (3.4.5)\n",
      "Requirement already satisfied, skipping upgrade: flake8 in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from paddlehub) (3.7.9)\n",
      "Requirement already satisfied, skipping upgrade: yapf==0.26.0 in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from paddlehub) (0.26.0)\n",
      "Requirement already satisfied, skipping upgrade: cfgv>=2.0.0 in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from pre-commit->paddlehub) (2.0.1)\n",
      "Requirement already satisfied, skipping upgrade: importlib-metadata; python_version < \"3.8\" in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from pre-commit->paddlehub) (0.23)\n",
      "Requirement already satisfied, skipping upgrade: identify>=1.0.0 in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from pre-commit->paddlehub) (1.4.10)\n",
      "Requirement already satisfied, skipping upgrade: virtualenv>=15.2 in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from pre-commit->paddlehub) (16.7.9)\n",
      "Requirement already satisfied, skipping upgrade: nodeenv>=0.11.1 in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from pre-commit->paddlehub) (1.3.4)\n",
      "Requirement already satisfied, skipping upgrade: aspy.yaml in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from pre-commit->paddlehub) (1.3.0)\n",
      "Requirement already satisfied, skipping upgrade: toml in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from pre-commit->paddlehub) (0.10.0)\n",
      "Requirement already satisfied, skipping upgrade: Werkzeug>=0.15 in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from flask>=1.1.0->paddlehub) (0.16.0)\n",
      "Requirement already satisfied, skipping upgrade: click>=5.1 in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from flask>=1.1.0->paddlehub) (7.0)\n",
      "Requirement already satisfied, skipping upgrade: Jinja2>=2.10.1 in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from flask>=1.1.0->paddlehub) (2.10.1)\n",
      "Requirement already satisfied, skipping upgrade: itsdangerous>=0.24 in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from flask>=1.1.0->paddlehub) (1.1.0)\n",
      "Requirement already satisfied, skipping upgrade: markdown>=2.6.8 in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from tensorboard>=1.15->paddlehub) (3.1.1)\n",
      "Requirement already satisfied, skipping upgrade: google-auth<2,>=1.6.3 in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from tensorboard>=1.15->paddlehub) (1.10.0)\n",
      "Requirement already satisfied, skipping upgrade: setuptools>=41.0.0 in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from tensorboard>=1.15->paddlehub) (41.4.0)\n",
      "Requirement already satisfied, skipping upgrade: wheel>=0.26; python_version >= \"3\" in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from tensorboard>=1.15->paddlehub) (0.33.6)\n",
      "Requirement already satisfied, skipping upgrade: google-auth-oauthlib<0.5,>=0.4.1 in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from tensorboard>=1.15->paddlehub) (0.4.1)\n",
      "Requirement already satisfied, skipping upgrade: absl-py>=0.4 in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from tensorboard>=1.15->paddlehub) (0.8.1)\n",
      "Requirement already satisfied, skipping upgrade: grpcio>=1.24.3 in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from tensorboard>=1.15->paddlehub) (1.26.0)\n",
      "Requirement already satisfied, skipping upgrade: pytz>=2011k in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from pandas; python_version >= \"3\"->paddlehub) (2019.3)\n",
      "Requirement already satisfied, skipping upgrade: python-dateutil>=2.5.0 in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from pandas; python_version >= \"3\"->paddlehub) (2.8.0)\n",
      "Requirement already satisfied, skipping upgrade: moviepy in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from tb-paddle->paddlehub) (1.0.1)\n",
      "Requirement already satisfied, skipping upgrade: certifi>=2017.4.17 in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from requests->paddlehub) (2019.9.11)\n",
      "Requirement already satisfied, skipping upgrade: urllib3!=1.25.0,!=1.25.1,<1.26,>=1.21.1 in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from requests->paddlehub) (1.25.6)\n",
      "Requirement already satisfied, skipping upgrade: idna<2.9,>=2.5 in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from requests->paddlehub) (2.8)\n",
      "Requirement already satisfied, skipping upgrade: mccabe<0.7.0,>=0.6.0 in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from flake8->paddlehub) (0.6.1)\n",
      "Requirement already satisfied, skipping upgrade: pyflakes<2.2.0,>=2.1.0 in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from flake8->paddlehub) (2.1.1)\n",
      "Requirement already satisfied, skipping upgrade: pycodestyle<2.6.0,>=2.5.0 in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from flake8->paddlehub) (2.5.0)\n",
      "Requirement already satisfied, skipping upgrade: entrypoints<0.4.0,>=0.3.0 in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from flake8->paddlehub) (0.3)\n",
      "Requirement already satisfied, skipping upgrade: zipp>=0.5 in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from importlib-metadata; python_version < \"3.8\"->pre-commit->paddlehub) (0.6.0)\n",
      "Requirement already satisfied, skipping upgrade: MarkupSafe>=0.23 in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from Jinja2>=2.10.1->flask>=1.1.0->paddlehub) (1.1.1)\n",
      "Requirement already satisfied, skipping upgrade: pyasn1-modules>=0.2.1 in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from google-auth<2,>=1.6.3->tensorboard>=1.15->paddlehub) (0.2.7)\n",
      "Requirement already satisfied, skipping upgrade: cachetools<5.0,>=2.0.0 in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from google-auth<2,>=1.6.3->tensorboard>=1.15->paddlehub) (4.0.0)\n",
      "Requirement already satisfied, skipping upgrade: rsa<4.1,>=3.1.4 in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from google-auth<2,>=1.6.3->tensorboard>=1.15->paddlehub) (4.0)\n",
      "Requirement already satisfied, skipping upgrade: requests-oauthlib>=0.7.0 in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from google-auth-oauthlib<0.5,>=0.4.1->tensorboard>=1.15->paddlehub) (1.3.0)\n",
      "Requirement already satisfied, skipping upgrade: imageio<3.0,>=2.5; python_version >= \"3.4\" in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from moviepy->tb-paddle->paddlehub) (2.6.1)\n",
      "Requirement already satisfied, skipping upgrade: imageio-ffmpeg>=0.2.0; python_version >= \"3.4\" in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from moviepy->tb-paddle->paddlehub) (0.3.0)\n",
      "Requirement already satisfied, skipping upgrade: proglog<=1.0.0 in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from moviepy->tb-paddle->paddlehub) (0.1.9)\n",
      "Requirement already satisfied, skipping upgrade: decorator<5.0,>=4.0.2 in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from moviepy->tb-paddle->paddlehub) (4.4.0)\n",
      "Requirement already satisfied, skipping upgrade: tqdm<5.0,>=4.11.2 in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from moviepy->tb-paddle->paddlehub) (4.36.1)\n",
      "Requirement already satisfied, skipping upgrade: more-itertools in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from zipp>=0.5->importlib-metadata; python_version < \"3.8\"->pre-commit->paddlehub) (7.2.0)\n",
      "Requirement already satisfied, skipping upgrade: pyasn1<0.5.0,>=0.4.6 in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from pyasn1-modules>=0.2.1->google-auth<2,>=1.6.3->tensorboard>=1.15->paddlehub) (0.4.8)\n",
      "Requirement already satisfied, skipping upgrade: oauthlib>=3.0.0 in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from requests-oauthlib>=0.7.0->google-auth-oauthlib<0.5,>=0.4.1->tensorboard>=1.15->paddlehub) (3.1.0)\n",
      "Installing collected packages: paddlehub\n",
      "  Found existing installation: paddlehub 1.5.0\n",
      "    Uninstalling paddlehub-1.5.0:\n",
      "      Successfully uninstalled paddlehub-1.5.0\n",
      "Successfully installed paddlehub-1.6.2\n",
      "Looking in indexes: https://pypi.mirrors.ustc.edu.cn/simple/\n",
      "Requirement already satisfied: moviepy in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (1.0.1)\n",
      "Requirement already satisfied: imageio-ffmpeg>=0.2.0; python_version >= \"3.4\" in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from moviepy) (0.3.0)\n",
      "Requirement already satisfied: numpy in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from moviepy) (1.16.4)\n",
      "Requirement already satisfied: imageio<3.0,>=2.5; python_version >= \"3.4\" in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from moviepy) (2.6.1)\n",
      "Requirement already satisfied: tqdm<5.0,>=4.11.2 in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from moviepy) (4.36.1)\n",
      "Requirement already satisfied: proglog<=1.0.0 in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from moviepy) (0.1.9)\n",
      "Requirement already satisfied: requests<3.0,>=2.8.1 in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from moviepy) (2.22.0)\n",
      "Requirement already satisfied: decorator<5.0,>=4.0.2 in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from moviepy) (4.4.0)\n",
      "Requirement already satisfied: pillow in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from imageio<3.0,>=2.5; python_version >= \"3.4\"->moviepy) (6.2.0)\n",
      "Requirement already satisfied: idna<2.9,>=2.5 in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from requests<3.0,>=2.8.1->moviepy) (2.8)\n",
      "Requirement already satisfied: chardet<3.1.0,>=3.0.2 in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from requests<3.0,>=2.8.1->moviepy) (3.0.4)\n",
      "Requirement already satisfied: certifi>=2017.4.17 in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from requests<3.0,>=2.8.1->moviepy) (2019.9.11)\n",
      "Requirement already satisfied: urllib3!=1.25.0,!=1.25.1,<1.26,>=1.21.1 in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from requests<3.0,>=2.8.1->moviepy) (1.25.6)\n",
      "Looking in indexes: https://pypi.mirrors.ustc.edu.cn/simple/\n",
      "Collecting pygame\n",
      "\u001b[?25l  Downloading https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/18/b3/0bf5afdcf6ef95d2a343cd7865585a6efe5e3e727c1a4f3385c9935248cf/pygame-1.9.6-cp37-cp37m-manylinux1_x86_64.whl (11.4MB)\n",
      "\u001b[K     |████████████████████████████████| 11.4MB 391kB/s eta 0:00:01\n",
      "\u001b[?25hInstalling collected packages: pygame\n",
      "Successfully installed pygame-1.9.6\n"
     ]
    }
   ],
   "source": [
    "!pip install --upgrade paddlepaddle\r\n",
    "!pip install --upgrade paddlehub\r\n",
    "!pip install moviepy\r\n",
    "!pip install pygame\r\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "pygame 1.9.6\n",
      "Hello from the pygame community. https://www.pygame.org/contribute.html\n"
     ]
    }
   ],
   "source": [
    "#相关库的导入\r\n",
    "import os\r\n",
    "import cv2\r\n",
    "import paddlehub as hub\r\n",
    "from moviepy.editor import *\r\n",
    "from matplotlib import pyplot as plt\r\n",
    "import numpy as np  \r\n",
    "import matplotlib.pyplot as plt \r\n",
    "import matplotlib.image as mpimg \r\n",
    "from PIL import ImageFont, ImageDraw, Image\r\n",
    "import requests\r\n",
    "\r\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Downloading stylepro_artistic\n",
      "[==================================================] 100.00%\n",
      "Uncompress /home/aistudio/.paddlehub/tmp/tmpsuwdvdb5/stylepro_artistic\n",
      "[==================================================] 100.00%\n",
      "Successfully installed stylepro_artistic-1.0.0\n"
     ]
    }
   ],
   "source": [
    "# !hub install pose_resnet50_mpii\r\n",
    "# !hub install deeplabv3p_xception65_humanseg\r\n",
    "!hub install stylepro_artistic"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\u001b[32m[2020-05-05 12:27:53,703] [    INFO] - Installing pose_resnet50_mpii module\u001b[0m\n",
      "\u001b[32m[2020-05-05 12:27:53,855] [    INFO] - Module pose_resnet50_mpii already installed in /home/aistudio/.paddlehub/modules/pose_resnet50_mpii\u001b[0m\n",
      "\u001b[32m[2020-05-05 12:27:54,205] [    INFO] - Installing deeplabv3p_xception65_humanseg module\u001b[0m\n",
      "\u001b[32m[2020-05-05 12:27:54,267] [    INFO] - Module deeplabv3p_xception65_humanseg already installed in /home/aistudio/.paddlehub/modules/deeplabv3p_xception65_humanseg\u001b[0m\n",
      "\u001b[32m[2020-05-05 12:27:57,065] [    INFO] - Installing stylepro_artistic module\u001b[0m\n",
      "\u001b[32m[2020-05-05 12:27:57,104] [    INFO] - Module stylepro_artistic already installed in /home/aistudio/.paddlehub/modules/stylepro_artistic\u001b[0m\n"
     ]
    }
   ],
   "source": [
    "# ## 模型安装\r\n",
    "# ## 位置点预测模型\r\n",
    "pose_resnet50_mpii = hub.Module(name=\"pose_resnet50_mpii\") \r\n",
    "# ## 抠图模型\r\n",
    "humanseg = hub.Module(name=\"deeplabv3p_xception65_humanseg\")\r\n",
    "## 风格转换模型\r\n",
    "stylepro_artistic = hub.Module(name=\"stylepro_artistic\")\r\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": false
   },
   "source": [
    "# 初始化数据集\n",
    "搞一个青你主题曲标准视频作为数据集，选取比较优秀的选手安崎小甜心的主题曲直拍作为参考视频，具体爬取微博小视频的方式涉及版权不作详细介绍\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "\r\n",
    "def download_video(url,path):\r\n",
    "    # url 为视频下载地址\r\n",
    "    # video保存地址\r\n",
    "    headers={\r\n",
    "            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36',\r\n",
    "            'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8',\r\n",
    "            'Accept-Encoding': 'gzip, deflate, br',\r\n",
    "            'Accept-Language': 'zh-CN,zh;q = 0.9'\r\n",
    "        }\r\n",
    "    mp4_info = requests.get(url=aq_url, headers=headers, stream=True, verify=False).content\r\n",
    "    with open(path, \"wb\") as f:\r\n",
    "        f.write(mp4_info)\r\n",
    "    f.close\r\n",
    "\r\n",
    "# aq_url = 'http://f.video.weibocdn.com/004tUGlvgx07Cqf0sEtG010412012bBR0E010.mp4?label=mp4_hd&template=352x640.25.0&trans_finger=1621fcd5d40969f1c74e6b06e52fcd54&Expires=1588498809&ssig=kFgW8J7KpP&KID=unistore,video'\r\n",
    "# download_video(aq_url,'video/aq_base.mp4')\r\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": false
   },
   "source": [
    "# 处理视频\n",
    "\n",
    "将视频逐帧读取成图片\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "def CutVideo2Image(video_path, img_path):\r\n",
    "    \"读取视频，获取每帧画面，输出为图片\"\r\n",
    "    \"video_path：输入视频路径\"\r\n",
    "    \"img_path：输出图片路径\"\r\n",
    "    cap = cv2.VideoCapture(video_path)\r\n",
    "    index = 0\r\n",
    "    global size_y ,size_x\r\n",
    "    while(True):\r\n",
    "        ret,frame = cap.read() \r\n",
    "        if ret and index < 2000:\r\n",
    "            # cv2.imwrite(img_path + '%d.jpg' % index, frame)\r\n",
    "            index += 1\r\n",
    "        else:\r\n",
    "            break\r\n",
    "        size_x = frame.shape[0]\r\n",
    "        size_y = frame.shape[1]\r\n",
    "    cap.release()\r\n",
    "    print('Video cut finish, all %d frame' % index)\r\n",
    "    print(\"imge size:x is {1},y is {0}\".format(size_x,size_y))\r\n",
    "   \r\n",
    "\r\n",
    "\r\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": false
   },
   "source": [
    "#  进行一张图片的人体关键点的预测与划线\n",
    "`作用`：确定数据格式，保证输出样式\n",
    "\n",
    " `功能`：，在预测图片的基础上进行划线连接\n",
    "\n",
    "**改动參数,将读进来的是BGR格式转为RGB**"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": false
   },
   "source": [
    "## 处理图片背景\n",
    "\n",
    "由于视频的光线色彩有点炫酷，所以处理一下图片进行抠图，然后合成白底输出"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "import os\r\n",
    "\r\n",
    "# 抠图\r\n",
    "def delete_bg(path):\r\n",
    "    \"抠图去除多余背景\"\r\n",
    "    \"path:需要抠图的图片目录\"\r\n",
    "    img_list= [os.path.join(path,f) for f in os.listdir(path) if f.endswith('.jpg')]\r\n",
    "    num=100 #定义每组包含的元素个数\r\n",
    "    for i in range(0,len(img_list),num):\r\n",
    "        humanseg.segmentation(data={\"image\":img_list[i:i+num]},output_dir='h_out/')\r\n",
    "\r\n",
    " #   results = humanseg.segmentation(data={\"image\":img_list})\r\n",
    "\r\n",
    "# delete_bg('data/img/base')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "from PIL import Image \r\n",
    "\r\n",
    "# 合成图片\r\n",
    "## base_image_path:背景路径\r\n",
    "## fore_image_path：前景路径\r\n",
    "## save_path： 输出图片路径\r\n",
    "## is_resize 是否大小统一\r\n",
    "def composition_img(base_image_path,fore_image_path,save_path,is_resize):\r\n",
    "    base_image = Image.open(base_image_path).convert('RGB')\r\n",
    "    if is_resize== True:\r\n",
    "        fore_image = Image.open(fore_image_path).resize(base_image.size)\r\n",
    "    else:\r\n",
    "        fore_image = Image.open(fore_image_path)\r\n",
    "        # 图片加权合成\r\n",
    "    scope_map = np.array(fore_image)[:,:,-1] / 255\r\n",
    "    scope_map = scope_map[:,:,np.newaxis]\r\n",
    "    scope_map = np.repeat(scope_map, repeats=3, axis=2)#表示将矩阵沿着每个元素复制3次\r\n",
    "    res_image = np.multiply(scope_map, np.array(fore_image)[:,:,:3]) + np.multiply((1-scope_map), np.array(base_image))\r\n",
    "        \r\n",
    "    #保存图片\r\n",
    "    res_image = Image.fromarray(np.uint8(res_image))\r\n",
    "    res_image.save(save_path)\r\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "\r\n",
    "# 添加白色背景转成jpg\r\n",
    "def add_white_bg(path,bgout_path,output_path):\r\n",
    "    \r\n",
    "    num = os.listdir(path)\r\n",
    "\r\n",
    "    for i in range(0,len(num)-1):\r\n",
    "        img_black = np.zeros((size_x,size_y,3), np.uint8)\r\n",
    "        img_black.fill(255)\r\n",
    "        img_black_path =bgout_path + str(i) + \".jpg\"\r\n",
    "        cv2.imwrite(img_black_path,img_black)\r\n",
    "\r\n",
    "    for i in range(0,len(num)-1):\r\n",
    "        # 合成图片\r\n",
    "        composition_img(img_black_path,path+str(i)+'.png',output_path+str(i)+'.jpg',True)\r\n",
    " \r\n",
    "\r\n",
    "# add_white_bg('h_out/','data/img/bgout/','data/img/bgres/')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": false
   },
   "source": [
    "## 使用关键点检测模型进行画点线输出"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": false
   },
   "source": [
    "### 定义数据转化格式\n",
    "`函数change_data(result) `\n",
    "\n",
    "`输入参数`：人体骨骼关键点检测模型的输出结果\n",
    "\n",
    " `输出参数`: 关于人体关键点的全局变量\n",
    " \n",
    "`函数功能`\t：`**将位置点预测模型输出的数据形式转为预期的数据**"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "\r\n",
    "def change_data(result):\r\n",
    "  global left_ankle,left_knee,left_hip,right_hip,right_knee,right_ankle,pelvis,thorax,upper_neck\r\n",
    "  global right_wrist,right_elbow,right_shoulder,left_shoulder,left_elbow,left_wrist,head_top\r\n",
    "\r\n",
    "  left_ankle = result['data']['left_ankle']\r\n",
    "  left_knee = result['data']['left_knee']\r\n",
    "  left_hip = result['data']['left_hip']\r\n",
    "  right_hip = result['data']['right_hip']\r\n",
    "  right_knee = result['data']['right_knee']\r\n",
    "  right_ankle = result['data']['right_ankle']\r\n",
    "  pelvis = result['data']['pelvis']\r\n",
    "  thorax = result['data']['thorax']\r\n",
    "  upper_neck = result['data']['upper neck']\r\n",
    "  head_top = result['data']['head top']\r\n",
    "  right_wrist = result['data']['right_wrist']\r\n",
    "  right_elbow = result['data']['right_elbow']\r\n",
    "  right_shoulder = result['data']['right_shoulder']\r\n",
    "  left_shoulder = result['data']['left_shoulder']\r\n",
    "  left_elbow = result['data']['left_elbow']\r\n",
    "  left_wrist = result['data']['left_wrist']\r\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": false
   },
   "source": [
    "### 将位置点连线\n",
    "格式\n",
    "`cv2.circle(img, point, point_size, point_color, thickness)`\n",
    "\n",
    "`输入参数`:`predict_img_path`为输入图片的地址\n",
    "\n",
    "`输出参数`：由两个分别是将人体关键点的线画在`空白背景上`/`模型输出的图片上`\n",
    "\n",
    "功能：`给图片划线`并写入将图片按一定顺序保存保存\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "def write_line(predict_img_path,output_path):\r\n",
    "    global count_frame \r\n",
    "    print(predict_img_path)\r\n",
    "    img = cv2.imread(predict_img_path)\r\n",
    "    thickness = 2\r\n",
    "    point_color = (0, 255, 0) # BGR  \r\n",
    "    # 格式cv2.circle(img, point, point_size, point_color, thickness)\r\n",
    "    cv2.line(img, (head_top[0],head_top[1]), (upper_neck[0],upper_neck[1]), point_color, 1)\r\n",
    "    cv2.line(img, (upper_neck[0],upper_neck[1]), (thorax[0],thorax[1]), point_color, thickness)\r\n",
    "    cv2.line(img, (upper_neck[0],upper_neck[1]), (left_shoulder[0],left_shoulder[1]), point_color, thickness)\r\n",
    "    cv2.line(img, (upper_neck[0],upper_neck[1]), (right_shoulder[0],right_shoulder[1]), point_color, thickness)\r\n",
    "    cv2.line(img, (left_shoulder[0],left_shoulder[1]), (left_elbow[0],left_elbow[1]), point_color, thickness)\r\n",
    "    cv2.line(img, (left_elbow[0],left_elbow[1]), (left_wrist[0],left_wrist[1]), point_color, thickness)\r\n",
    "    cv2.line(img, (right_shoulder[0],right_shoulder[1]), (right_elbow[0],right_elbow[1]), point_color, thickness)\r\n",
    "    cv2.line(img, (right_elbow[0],right_elbow[1]), (right_wrist[0],right_wrist[1]), point_color, thickness)\r\n",
    "    cv2.line(img, (left_hip[0],left_hip[1]), (left_knee[0],left_knee[1]), point_color, thickness)\r\n",
    "    cv2.line(img, (left_knee[0],left_knee[1]), (left_ankle[0],left_ankle[1]), point_color, thickness)\r\n",
    "    cv2.line(img, (right_hip[0],right_hip[1]), (right_knee[0],right_knee[1]), point_color, thickness)\r\n",
    "    cv2.line(img, (right_knee[0],right_knee[1]), (right_ankle[0],right_ankle[1]), point_color, thickness)\r\n",
    "    cv2.line(img, (thorax[0],thorax[1]), (left_hip[0],left_hip[1]), point_color, thickness)\r\n",
    "    cv2.line(img, (thorax[0],thorax[1]), (right_hip[0],right_hip[1]), point_color, thickness)\r\n",
    "    true_count = count_frame //2\r\n",
    "    # pose_img_path = \"data/img/pose_frame/\" + str(true_count) +\".jpg\"\r\n",
    "    # img_black_path = \"data/img/black_frame/\" + str(true_count) + \".jpg\"\r\n",
    "    # if (count_frame %2):\r\n",
    "    #     cv2.imwrite(output_path,img)\r\n",
    "    # else:\r\n",
    "    #     cv2.imwrite(img_black_path,img)\r\n",
    "    cv2.imwrite(output_path+ str(true_count) +\".jpg\",img)\r\n",
    "    count_frame = count_frame +1\r\n",
    "\r\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": false
   },
   "source": [
    "### 连接监测点进行画线并输出"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "def GetOutputPose(frame_path,output_black_path,output_pose_path):\r\n",
    "    \"输入需要进行关键点检测的图片目录，进行检测后分别输出原图加线的图片以及只有关键点连线的图\"\r\n",
    "    \"black_path:只有关键点连线的图片目录\"\r\n",
    "    \"frame_path:需要处理的图片目录\"\r\n",
    "    \"output_pose_path:带原图加连线的图片目录\"\r\n",
    "    # 配置\r\n",
    "    num = os.listdir(frame_path)\r\n",
    "    for i in range(0,len(num)-1):\r\n",
    "        img_black = np.zeros((size_x,size_y,3), np.uint8)\r\n",
    "        img_black.fill(255)\r\n",
    "        img_black_path =output_black_path + str(i) + \".jpg\"\r\n",
    "        cv2.imwrite(img_black_path,img_black)\r\n",
    "    for i in range(0,len(num)-1):\r\n",
    "        path_dict = frame_path + str(i) + \".jpg\"\r\n",
    "        input_dict = {\"image\":[path_dict]}\r\n",
    "        print(\"This is OutputPose {} pictrue\".format(i))\r\n",
    "        # img_black_path = \"data/img/black_frame/\" + str(i) + \".jpg\"\r\n",
    "        results = pose_resnet50_mpii.keypoint_detection(data=input_dict)\r\n",
    "        for result in results:\r\n",
    "            change_data(result)\r\n",
    "            write_line(path_dict,output_pose_path)\r\n",
    "            write_line(img_black_path,output_black_path)\r\n",
    "\r\n",
    "\r\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": false
   },
   "source": [
    "# 转换风格\n",
    "将安崎小甜心的主题曲直拍视频专程水墨画风格"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": false
   },
   "source": [
    "## 定义转换风格方法\n",
    "输入需要进行风格迁移的图片路径列表，批量转换并输出"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "def change_style(img_list,output_dir):\r\n",
    "    \"\"\"\r\n",
    "    调用模型进行风格转换\r\n",
    "    img_list: 需要转换的图片对象集合\r\n",
    "    output_dir:图片输出目录\r\n",
    "    \"\"\"\r\n",
    "    print(img_list)\r\n",
    "\r\n",
    "    result = stylepro_artistic.style_transfer(\r\n",
    "            paths=img_list,\r\n",
    "            # use_gpu=True,\r\n",
    "            visualization=True,\r\n",
    "            output_dir=output_dir,\r\n",
    "            alpha=0.5\r\n",
    "        )     \r\n",
    "    \r\n",
    "\r\n",
    "\r\n",
    "\r\n",
    "def get_img_list(frame_path):\r\n",
    "    \"\"\"\r\n",
    "    组装转换风格imglist\r\n",
    "    frame_path：需要转换风格的原图目录\r\n",
    "    \"\"\"\r\n",
    "    num = os.listdir(frame_path)\r\n",
    "    img_list=[]\r\n",
    "    for i in range(0,len(num)-1):\r\n",
    "        img_path =frame_path + str(i) + \".jpg\"\r\n",
    "        img={}\r\n",
    "        styles=['work/style/timg3.jpg']\r\n",
    "        img['styles']=styles\r\n",
    "        img['content']=img_path\r\n",
    "        img_list.append(img)\r\n",
    "    return img_list\r\n",
    "\r\n",
    "\r\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": false
   },
   "source": [
    "## 视频合成\n",
    "将风格迁移完的美美的图片重新组装成视频并输出"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "def comp_video(comb_path):\r\n",
    "    \"\"\"\r\n",
    "    视频合成\r\n",
    "    comb_path: 合成图片所在目录\r\n",
    "    \"\"\"\r\n",
    "    fourcc = cv2.VideoWriter_fourcc(*'MP4V')\r\n",
    "    video_tmp_name = comb_path.split(\"/\")[2]\r\n",
    "    video_name = \"video/\" + str(video_tmp_name) + \".mp4\"\r\n",
    "    files = os.listdir(comb_path)\r\n",
    "    out = cv2.VideoWriter(video_name,fourcc,30.0,(size_y, size_x))\r\n",
    "    # 排序\r\n",
    "    files = sorted(files, key=lambda x: os.path.getmtime(os.path.join(comb_path, x)))\r\n",
    "    print(\"一共有{}帧图片要合成\".format(len(files)))\r\n",
    "    for i in range(len(files)):\r\n",
    "        img = cv2.imread(comb_path+files[i])\r\n",
    "        out.write(img)    # 保存帧\r\n",
    "    out.release()\r\n",
    "\r\n",
    "\r\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": false
   },
   "source": [
    "## 视频音频合成\n",
    "将原本视频的音频合到新风格的视频上"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "\r\n",
    "\r\n",
    "def getMusic(video_name):\r\n",
    "\r\n",
    "    \"\"\"\r\n",
    "\r\n",
    "    获取指定视频的音频\r\n",
    "\r\n",
    "    \"\"\"\r\n",
    "\r\n",
    "    # 读取视频文件\r\n",
    "\r\n",
    "    video = VideoFileClip(video_name)\r\n",
    "\r\n",
    "    # 返回音频\r\n",
    "\r\n",
    "    return video.audio\r\n",
    "\r\n",
    "\r\n",
    "def addMusic(video_name, audio,output_video):\r\n",
    "\r\n",
    "    \"\"\"实现混流，给video_name添加音频\"\"\"\r\n",
    "\r\n",
    "    # 读取视频\r\n",
    "\r\n",
    "    video = VideoFileClip(video_name)\r\n",
    "\r\n",
    "    # 设置视频的音频\r\n",
    "\r\n",
    "    video = video.set_audio(audio)\r\n",
    "\r\n",
    "    # 保存新的视频文件\r\n",
    "\r\n",
    "    video.write_videofile(output_video)\r\n",
    "    \r\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": false
   },
   "source": [
    "# 动作评估\n",
    "\n",
    "上面我们已经生成了青春有你2的主题曲标准舞蹈的关键点画线集合，接下来，我们需要实现对比标准舞蹈动作以及测试舞蹈动作，计算每一帧图片的相似度，然后通过均值计算获取选手主题曲的舞蹈实力分数\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": false
   },
   "source": [
    "## 相似值计算\n",
    "基于直方图计算两个图片之间的相似度"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "import cv2\r\n",
    "\r\n",
    "# 计算单通道的直方图的相似值\r\n",
    "def calculate(image1, image2):\r\n",
    "    hist1 = cv2.calcHist([image1], [0], None, [256], [0.0, 255.0])\r\n",
    "    hist2 = cv2.calcHist([image2], [0], None, [256], [0.0, 255.0])\r\n",
    "    # 计算直方图的重合度\r\n",
    "    degree = 0\r\n",
    "    for i in range(len(hist1)):\r\n",
    "        if hist1[i] != hist2[i]:\r\n",
    "            degree = degree + (1 - abs(hist1[i] - hist2[i]) / max(hist1[i], hist2[i]))\r\n",
    "        else:\r\n",
    "            degree = degree + 1\r\n",
    "    degree = degree / len(hist1)\r\n",
    "    return degree"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": false
   },
   "source": [
    "## 将实力值合成到测试选手的图片上面"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "from PIL import Image\r\n",
    "from PIL import ImageFilter\r\n",
    "from PIL import ImageEnhance\r\n",
    "from PIL import ImageDraw , ImageFont\r\n",
    " \r\n",
    "def draw_text(bg_path,text,output_path):\r\n",
    "    \"\"\"\r\n",
    "    实现图片上面叠加中文\r\n",
    "    bg_path：需要加中文的图片\r\n",
    "    text: 添加的中文内容\r\n",
    "    output_path： 合成后输出的图片路径\r\n",
    "    \"\"\"\r\n",
    "    \r\n",
    "    im = Image.open(bg_path)\r\n",
    "    draw = ImageDraw.Draw(im)\r\n",
    "    fnt = ImageFont.truetype(r'fonts/SimHei.ttf',32)\r\n",
    "    draw.text((100, 600), text, fill='red', font=fnt)\r\n",
    "    im.show()\r\n",
    "    im.save(output_path)\r\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": false
   },
   "source": [
    "# 分析测试选手的大众好感度\n",
    "主要是基于LSTM模型对微博评论进行情感分析\n",
    "1.爬取与测试选手相关微博评论\n",
    "2.训练模型\n",
    "3.得出选手好感度以及搜索输出选手话题词云\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Looking in indexes: https://pypi.mirrors.ustc.edu.cn/simple/\n",
      "Collecting pyquery\n",
      "  Downloading https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/78/43/95d42e386c61cb639d1a0b94f0c0b9f0b7d6b981ad3c043a836c8b5bc68b/pyquery-1.4.1-py2.py3-none-any.whl\n",
      "Collecting cssselect>0.7.9 (from pyquery)\n",
      "  Downloading https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/3b/d4/3b5c17f00cce85b9a1e6f91096e1cc8e8ede2e1be8e96b87ce1ed09e92c5/cssselect-1.1.0-py2.py3-none-any.whl\n",
      "Collecting lxml>=2.1 (from pyquery)\n",
      "\u001b[33m  WARNING: Retrying (Retry(total=4, connect=None, read=None, redirect=None, status=None)) after connection broken by 'ReadTimeoutError(\"HTTPSConnectionPool(host='mirrors.ustc.edu.cn', port=443): Read timed out. (read timeout=15)\")': /pypi/web/simple/lxml/\u001b[0m\n",
      "\u001b[?25l  Downloading https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/85/9e/93e2c3af278c7c8b6826666bbcb145af2829bd761c3b329e51cd6343836c/lxml-4.5.0-cp37-cp37m-manylinux1_x86_64.whl (5.7MB)\n",
      "\u001b[K     |████████████████████████████████| 5.7MB 58.8MB/s eta 0:00:01\n",
      "\u001b[?25hInstalling collected packages: cssselect, lxml, pyquery\n",
      "Successfully installed cssselect-1.1.0 lxml-4.5.0 pyquery-1.4.1\n"
     ]
    }
   ],
   "source": [
    "!pip install pyquery"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": false
   },
   "source": [
    "## 爬取微博评论数据"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "https://m.weibo.cn/api/container/getIndex?containerid=100103type%3D1%26q%3D%E8%B0%A2%E5%8F%AF%E5%AF%85&page_type=searchall&page=1\n",
      "1\n",
      "https://m.weibo.cn/api/container/getIndex?containerid=100103type%3D1%26q%3D%E8%B0%A2%E5%8F%AF%E5%AF%85&page_type=searchall&page=2\n",
      "2\n",
      "https://m.weibo.cn/api/container/getIndex?containerid=100103type%3D1%26q%3D%E8%B0%A2%E5%8F%AF%E5%AF%85&page_type=searchall&page=3\n",
      "3\n",
      "https://m.weibo.cn/api/container/getIndex?containerid=100103type%3D1%26q%3D%E8%B0%A2%E5%8F%AF%E5%AF%85&page_type=searchall&page=4\n",
      "4\n",
      "https://m.weibo.cn/api/container/getIndex?containerid=100103type%3D1%26q%3D%E8%B0%A2%E5%8F%AF%E5%AF%85&page_type=searchall&page=5\n",
      "5\n",
      "https://m.weibo.cn/api/container/getIndex?containerid=100103type%3D1%26q%3D%E8%B0%A2%E5%8F%AF%E5%AF%85&page_type=searchall&page=6\n",
      "6\n",
      "https://m.weibo.cn/api/container/getIndex?containerid=100103type%3D1%26q%3D%E8%B0%A2%E5%8F%AF%E5%AF%85&page_type=searchall&page=7\n",
      "7\n",
      "https://m.weibo.cn/api/container/getIndex?containerid=100103type%3D1%26q%3D%E8%B0%A2%E5%8F%AF%E5%AF%85&page_type=searchall&page=8\n",
      "8\n",
      "https://m.weibo.cn/api/container/getIndex?containerid=100103type%3D1%26q%3D%E8%B0%A2%E5%8F%AF%E5%AF%85&page_type=searchall&page=9\n",
      "9\n",
      "https://m.weibo.cn/api/container/getIndex?containerid=100103type%3D1%26q%3D%E8%B0%A2%E5%8F%AF%E5%AF%85&page_type=searchall&page=10\n",
      "10\n",
      "https://m.weibo.cn/api/container/getIndex?containerid=100103type%3D1%26q%3D%E8%B0%A2%E5%8F%AF%E5%AF%85&page_type=searchall&page=11\n",
      "11\n",
      "https://m.weibo.cn/api/container/getIndex?containerid=100103type%3D1%26q%3D%E8%B0%A2%E5%8F%AF%E5%AF%85&page_type=searchall&page=12\n",
      "12\n",
      "https://m.weibo.cn/api/container/getIndex?containerid=100103type%3D1%26q%3D%E8%B0%A2%E5%8F%AF%E5%AF%85&page_type=searchall&page=13\n",
      "13\n",
      "https://m.weibo.cn/api/container/getIndex?containerid=100103type%3D1%26q%3D%E8%B0%A2%E5%8F%AF%E5%AF%85&page_type=searchall&page=14\n",
      "14\n",
      "https://m.weibo.cn/api/container/getIndex?containerid=100103type%3D1%26q%3D%E8%B0%A2%E5%8F%AF%E5%AF%85&page_type=searchall&page=15\n",
      "15\n",
      "https://m.weibo.cn/api/container/getIndex?containerid=100103type%3D1%26q%3D%E8%B0%A2%E5%8F%AF%E5%AF%85&page_type=searchall&page=16\n",
      "16\n",
      "https://m.weibo.cn/api/container/getIndex?containerid=100103type%3D1%26q%3D%E8%B0%A2%E5%8F%AF%E5%AF%85&page_type=searchall&page=17\n",
      "17\n",
      "https://m.weibo.cn/api/container/getIndex?containerid=100103type%3D1%26q%3D%E8%B0%A2%E5%8F%AF%E5%AF%85&page_type=searchall&page=18\n",
      "18\n",
      "https://m.weibo.cn/api/container/getIndex?containerid=100103type%3D1%26q%3D%E8%B0%A2%E5%8F%AF%E5%AF%85&page_type=searchall&page=19\n",
      "19\n",
      "https://m.weibo.cn/api/container/getIndex?containerid=100103type%3D1%26q%3D%E8%B0%A2%E5%8F%AF%E5%AF%85&page_type=searchall&page=20\n",
      "20\n",
      "https://m.weibo.cn/api/container/getIndex?containerid=100103type%3D1%26q%3D%E8%B0%A2%E5%8F%AF%E5%AF%85&page_type=searchall&page=21\n",
      "21\n",
      "https://m.weibo.cn/api/container/getIndex?containerid=100103type%3D1%26q%3D%E8%B0%A2%E5%8F%AF%E5%AF%85&page_type=searchall&page=22\n",
      "22\n",
      "https://m.weibo.cn/api/container/getIndex?containerid=100103type%3D1%26q%3D%E8%B0%A2%E5%8F%AF%E5%AF%85&page_type=searchall&page=23\n",
      "23\n",
      "https://m.weibo.cn/api/container/getIndex?containerid=100103type%3D1%26q%3D%E8%B0%A2%E5%8F%AF%E5%AF%85&page_type=searchall&page=24\n",
      "24\n",
      "https://m.weibo.cn/api/container/getIndex?containerid=100103type%3D1%26q%3D%E8%B0%A2%E5%8F%AF%E5%AF%85&page_type=searchall&page=25\n",
      "25\n",
      "https://m.weibo.cn/api/container/getIndex?containerid=100103type%3D1%26q%3D%E8%B0%A2%E5%8F%AF%E5%AF%85&page_type=searchall&page=26\n",
      "26\n",
      "https://m.weibo.cn/api/container/getIndex?containerid=100103type%3D1%26q%3D%E8%B0%A2%E5%8F%AF%E5%AF%85&page_type=searchall&page=27\n",
      "27\n",
      "https://m.weibo.cn/api/container/getIndex?containerid=100103type%3D1%26q%3D%E8%B0%A2%E5%8F%AF%E5%AF%85&page_type=searchall&page=28\n",
      "28\n",
      "https://m.weibo.cn/api/container/getIndex?containerid=100103type%3D1%26q%3D%E8%B0%A2%E5%8F%AF%E5%AF%85&page_type=searchall&page=29\n",
      "29\n",
      "https://m.weibo.cn/api/container/getIndex?containerid=100103type%3D1%26q%3D%E8%B0%A2%E5%8F%AF%E5%AF%85&page_type=searchall&page=30\n",
      "30\n",
      "https://m.weibo.cn/api/container/getIndex?containerid=100103type%3D1%26q%3D%E8%B0%A2%E5%8F%AF%E5%AF%85&page_type=searchall&page=31\n",
      "31\n",
      "https://m.weibo.cn/api/container/getIndex?containerid=100103type%3D1%26q%3D%E8%B0%A2%E5%8F%AF%E5%AF%85&page_type=searchall&page=32\n",
      "32\n",
      "https://m.weibo.cn/api/container/getIndex?containerid=100103type%3D1%26q%3D%E8%B0%A2%E5%8F%AF%E5%AF%85&page_type=searchall&page=33\n",
      "33\n",
      "https://m.weibo.cn/api/container/getIndex?containerid=100103type%3D1%26q%3D%E8%B0%A2%E5%8F%AF%E5%AF%85&page_type=searchall&page=34\n",
      "34\n",
      "https://m.weibo.cn/api/container/getIndex?containerid=100103type%3D1%26q%3D%E8%B0%A2%E5%8F%AF%E5%AF%85&page_type=searchall&page=35\n",
      "35\n",
      "https://m.weibo.cn/api/container/getIndex?containerid=100103type%3D1%26q%3D%E8%B0%A2%E5%8F%AF%E5%AF%85&page_type=searchall&page=36\n",
      "36\n",
      "https://m.weibo.cn/api/container/getIndex?containerid=100103type%3D1%26q%3D%E8%B0%A2%E5%8F%AF%E5%AF%85&page_type=searchall&page=37\n",
      "37\n",
      "https://m.weibo.cn/api/container/getIndex?containerid=100103type%3D1%26q%3D%E8%B0%A2%E5%8F%AF%E5%AF%85&page_type=searchall&page=38\n",
      "38\n",
      "https://m.weibo.cn/api/container/getIndex?containerid=100103type%3D1%26q%3D%E8%B0%A2%E5%8F%AF%E5%AF%85&page_type=searchall&page=39\n",
      "39\n",
      "https://m.weibo.cn/api/container/getIndex?containerid=100103type%3D1%26q%3D%E8%B0%A2%E5%8F%AF%E5%AF%85&page_type=searchall&page=40\n",
      "40\n",
      "https://m.weibo.cn/api/container/getIndex?containerid=100103type%3D1%26q%3D%E8%B0%A2%E5%8F%AF%E5%AF%85&page_type=searchall&page=41\n",
      "41\n",
      "https://m.weibo.cn/api/container/getIndex?containerid=100103type%3D1%26q%3D%E8%B0%A2%E5%8F%AF%E5%AF%85&page_type=searchall&page=42\n",
      "42\n",
      "https://m.weibo.cn/api/container/getIndex?containerid=100103type%3D1%26q%3D%E8%B0%A2%E5%8F%AF%E5%AF%85&page_type=searchall&page=43\n",
      "43\n",
      "https://m.weibo.cn/api/container/getIndex?containerid=100103type%3D1%26q%3D%E8%B0%A2%E5%8F%AF%E5%AF%85&page_type=searchall&page=44\n",
      "44\n",
      "https://m.weibo.cn/api/container/getIndex?containerid=100103type%3D1%26q%3D%E8%B0%A2%E5%8F%AF%E5%AF%85&page_type=searchall&page=45\n",
      "45\n",
      "https://m.weibo.cn/api/container/getIndex?containerid=100103type%3D1%26q%3D%E8%B0%A2%E5%8F%AF%E5%AF%85&page_type=searchall&page=46\n",
      "46\n",
      "https://m.weibo.cn/api/container/getIndex?containerid=100103type%3D1%26q%3D%E8%B0%A2%E5%8F%AF%E5%AF%85&page_type=searchall&page=47\n",
      "47\n",
      "https://m.weibo.cn/api/container/getIndex?containerid=100103type%3D1%26q%3D%E8%B0%A2%E5%8F%AF%E5%AF%85&page_type=searchall&page=48\n",
      "48\n",
      "https://m.weibo.cn/api/container/getIndex?containerid=100103type%3D1%26q%3D%E8%B0%A2%E5%8F%AF%E5%AF%85&page_type=searchall&page=49\n",
      "49\n",
      "https://m.weibo.cn/api/container/getIndex?containerid=100103type%3D1%26q%3D%E8%B0%A2%E5%8F%AF%E5%AF%85&page_type=searchall&page=50\n",
      "50\n"
     ]
    }
   ],
   "source": [
    "import requests\r\n",
    "from pyquery import PyQuery as pq\r\n",
    "import time\r\n",
    "from urllib.parse import quote\r\n",
    "import os\r\n",
    "\r\n",
    "def get_page(page): \r\n",
    "    \"\"\"\r\n",
    "    通过微博api获取微博数据\r\n",
    "    page: 分页页数\r\n",
    "    \"\"\"\r\n",
    "    headers = {\r\n",
    "        'Host': 'm.weibo.cn',\r\n",
    "        'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36',\r\n",
    "        'X-Requested-With': 'XMLHttpRequest',\r\n",
    "    }\r\n",
    "\r\n",
    "    url = 'https://m.weibo.cn/api/container/getIndex?containerid=100103type%3D1%26q%3D'+quote(m)+'&page_type=searchall&page='+str(page)#将你检索内容转为超链接\r\n",
    "    print(url)\r\n",
    "    try:\r\n",
    "        response = requests.get(url, headers=headers)\r\n",
    "        if response.status_code == 200:\r\n",
    "            print(page)\r\n",
    "            return response.json()\r\n",
    "    except requests.ConnectionError as e:\r\n",
    "        print('Error', e.args)\r\n",
    "\r\n",
    "\r\n",
    "def parse_page(json):\r\n",
    "    f_comments=open('comment/comment.txt','a')\r\n",
    "    f_user=open('comment/weibo_user.txt','a')\r\n",
    "\r\n",
    "    if json:\r\n",
    "        items = json.get('data').get('cards')\r\n",
    "        for i in items:\r\n",
    "      \r\n",
    "            item = i.get('mblog')\r\n",
    "            if item == None:\r\n",
    "                continue\r\n",
    "\r\n",
    "            weibo = {}\r\n",
    "            weibo['id'] = item.get('id')\r\n",
    "            weibo['text'] = pq(item.get('text')).text()\r\n",
    "            weibo['name'] = item.get('user').get('screen_name')\r\n",
    "            if item.get('longText') != None :#要注意微博分长文本与文本，较长的文本在文本中会显示不全，故我们要判断并抓取。\r\n",
    "                weibo['longText'] = item.get('longText').get('longTextContent')\r\n",
    "            else:\r\n",
    "                weibo['longText'] =None\r\n",
    "            # print(weibo['name'])\r\n",
    "            # print(weibo['text'])\r\n",
    "            if weibo['longText'] !=None:\r\n",
    "                f_comments.write(weibo['longText'])\r\n",
    "                \r\n",
    "            f_comments.write(weibo['text']+'\\n')\r\n",
    "            f_user.write(weibo['name']+'\\n')\r\n",
    "              \r\n",
    "            #     yield weibo\r\n",
    "    f_comments.close()\r\n",
    "    f_user.close()\r\n",
    "\r\n",
    "if __name__ == '__main__':\r\n",
    "    m = '谢可寅'\r\n",
    "    n = 50\r\n",
    "  \r\n",
    "    for page in range(1,n+1):\r\n",
    "        time.sleep(1)         #设置睡眠时间，防止被封号\r\n",
    "        json = get_page(page)\r\n",
    "        parse_page(json)\r\n",
    "\r\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": false
   },
   "source": [
    "## 清洗数据"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "import re #正则匹配\r\n",
    "import jieba #中文分词\r\n",
    "\r\n",
    "#去除文本中特殊字符\r\n",
    "def clear_special_char(content):\r\n",
    "    '''\r\n",
    "    正则处理特殊字符\r\n",
    "    参数 content:原文本\r\n",
    "    return: 清除后的文本\r\n",
    "    '''\r\n",
    "    f_clear = open('comment/clear_comment.txt','a')\r\n",
    "    clear_content = re.findall('[\\u4e00-\\u9fa5a-zA-Z0-9]+',content,re.S)   #只要字符串中的中文，字母，数字\r\n",
    "    str=','.join(clear_content)\r\n",
    "    f_clear.write(str+'\\n')\r\n",
    "    f_clear.close\r\n",
    "    return str\r\n",
    "\r\n",
    "def fenci(content):\r\n",
    "    '''\r\n",
    "    利用jieba进行分词\r\n",
    "    参数 text:需要分词的句子或文本\r\n",
    "    return：分词结果\r\n",
    "    '''\r\n",
    "    jieba.load_userdict(r\"dic/user_dic.txt\")\r\n",
    "    seg_list = jieba.cut(content)\r\n",
    "    return seg_list\r\n",
    "\r\n",
    "\r\n",
    "\r\n",
    "\r\n",
    "def stopwordslist():\r\n",
    "    '''\r\n",
    "    创建停用词表\r\n",
    "    参数 file_path:停用词文本路径\r\n",
    "    return：停用词list\r\n",
    "    '''\r\n",
    "    stopwords = [line.strip() for line in open('work/stopwords.txt',encoding='UTF-8').readlines()]\r\n",
    "    acstopwords=['哦','因此','不然','谢可寅','超话']\r\n",
    "    stopwords.extend(acstopwords)\r\n",
    "    return stopwords\r\n",
    "\r\n",
    "import pandas as pd\r\n",
    "\r\n",
    "def movestopwords(sentence_depart,stopwords):\r\n",
    "    '''\r\n",
    "    去除停用词,统计词频\r\n",
    "    参数 file_path:停用词文本路径 stopwords:停用词list counts: 词频统计结果\r\n",
    "    return：None\r\n",
    "    '''\r\n",
    "    segments = []\r\n",
    "   \r\n",
    "    # 去停用词\r\n",
    "    for word in sentence_depart:\r\n",
    "        if word not in stopwords:\r\n",
    "            if word != '\\t':\r\n",
    "                # outstr += word\r\n",
    "                # outstr += \" \"\r\n",
    "                segments.append(word)\r\n",
    "   \r\n",
    "    return segments\r\n",
    "\r\n",
    "\r\n",
    "\r\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "# 下载中文字体\r\n",
    "\r\n",
    "# 将字体文件复制到matplotlib字体路径\r\n",
    "!cp fonts/SimHei.ttf /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages/matplotlib/mpl-data/fonts/ttf/\r\n",
    "# # 一般只需要将字体文件复制到系统字体目录下即可，但是在aistudio上该路径没有写权限，所以此方法不能用\r\n",
    "!cp fonts/SimHei.ttf .fonts\r\n",
    "# !rm -rf .cache/matplotlib\r\n",
    "!rm -rf .cache/matplotlib\r\n",
    "\r\n",
    "from matplotlib.font_manager import fontManager\r\n",
    "\r\n",
    "\r\n",
    "plt.rcParams['font.sans-serif'] = ['SimHei']\r\n",
    "plt.rcParams['axes.unicode_minus'] = False"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": false
   },
   "source": [
    "## 统计数据"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "2020-05-05 00:21:45,571-WARNING: No handles with labels found to put in legend.\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[('青春有你', 460), ('喻言', 196), ('虞书欣', 181), ('金子涵', 172), ('刘雨昕', 168), ('孔雪儿', 155), ('赵小棠', 151), ('许佳琪', 142), ('直拍', 135), ('喜欢', 125)]\n",
      "{'青春有你': 460, '喻言': 196, '虞书欣': 181, '金子涵': 172, '刘雨昕': 168, '孔雪儿': 155, '赵小棠': 151, '许佳琪': 142, '直拍': 135, '喜欢': 125}\n"
     ]
    },
    {
     "data": {
      "image/png": "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AMAkgiQAAAAAJhEkAQAAADCJIAkAAACASQRJAAAAAEwiSAIAAABgEkESAAAAAJMIkgAAAACYRJAEAAAAwCSCJAAAAAAmESQBAAAAMIkgCQAAAIBJBEkAAAAATCJIAgAAAGASQRIAAAAAkwiSAAAAAJhEkAQAAADAJIIkAAAAACYRJAEAAAAwiSAJAAAAgEkESQAAAABMIkgCAAAAYBJBEgAAAACTCJIAAAAAmESQBAAAAMAkgiQAAAAAJhEkAQAAADCJIAkAAACASQRJAAAAAEwiSAIAAABgEkESAAAAAJMIkgAAAACYRJAEAAAAwCSCJAAAAAAmESQBAAAAMIkgCQAAAIBJBEkAAAAATCJIAgAAAGASQRIAAAAAkwiSAAAAAJhEkAQAAADAJIIkAAAAACYRJAEAAAAwiSAJAAAAgEkESQAAAABMIkgCAAAAYBJBEgAAAACTCJIAAAAAmESQBAAAAMAkgiQAAAAAJhEkAQAAADCJIAkAAACASQRJAAAAAEwiSAIAAABgEkESAAAAAJMIkgAAAACYRJAEAAAAwCSCJAAAAAAmESQBAAAAMIkgCQAAAIBJBEkAAAAATCJIAgAAAGASQRIAAAAAkwiSAAAAAJhEkAQAAADAJIIkAAAAACYRJAEAAAAwiSAJAAAAgEkESQAAAABMIkgCAAAAYBJBEgAAAACTCJIAAAAAmESQBAAAAMAkgiQAAAAAJhEkAQAAADCJIAkAAACASQRJAAAAAEwiSAIAAABgEkESAAAAAJMIkgAAAACYRJAEAAAAwCSCJAAAAAAmESQBAAAAMIkgCQAAAIBJBEkAAAAATCJIAgAAAGASQRIAAAAAkwiSAAAAAJhEkAQAAADAJIIkAAAAACYRJAEAAAAwiSAJAAAAgEkESQAAAABMIkgCAAAAYBJBEgAAAACTCJIAAAAAmESQBAAAAMAkgiQAAAAAJhEkAQAAADCJIAkAAACASQRJAAAAAEwiSAIAAABgEkESAAAAAJMIkgAAAACYRJAEAAAAwCSCJAAAAAAmESQBAAAAMIkgCQAAAIBJBEkAAAAATCJIAgAAAGASQRIAAAAAkwiSAAAAAJhEkAQAAADAJIIkAAAAACYRJAEAAAAwiSAJAAAAgEkESQAAAABMIkgCAAAAYBJBEgAAAACTCJIAAAAAmESQBAAAAMAkgiQAAAAAJhEkAQAA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\n",
      "text/plain": [
       "<Figure size 1440x1080 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "import collections \r\n",
    "\r\n",
    "def drawcounts(segments):\r\n",
    "    '''\r\n",
    "    绘制词频统计表\r\n",
    "    参数 counts: 词频统计结果 num:绘制topN\r\n",
    "    return：none\r\n",
    "    '''\r\n",
    "    # 词频统计\r\n",
    "    word_counts = collections.Counter(segments) # 对分词做词频统计\r\n",
    "    word_counts_top10 = word_counts.most_common(10) # 获取前10最高频的词\r\n",
    "    print (word_counts_top10) \r\n",
    "    dic=dict(word_counts_top10)\r\n",
    "    print(dic)\r\n",
    "    x_values=[]\r\n",
    "    y_values=[]\r\n",
    "    for k in dic: \r\n",
    "        x_values.append(k)\r\n",
    "        y_values.append(dic[k])\r\n",
    "    # 设置显示中文\r\n",
    "\r\n",
    "    plt.rcParams['font.sans-serif'] = ['SimHei'] # 指定默认字体\r\n",
    "\r\n",
    "    plt.figure(figsize=(20,15))\r\n",
    "\r\n",
    "    plt.bar(range(len(y_values)), y_values,color='r',tick_label=x_values,facecolor='#9999ff',edgecolor='white')\r\n",
    "\r\n",
    "    # 这里是调节横坐标的倾斜度，rotation是度数，以及设置刻度字体大小\r\n",
    "    plt.xticks(rotation=45,fontsize=20)\r\n",
    "    plt.yticks(fontsize=20)\r\n",
    "\r\n",
    "    plt.legend()\r\n",
    "    plt.title('''谢可寅微博评论词频统计''',fontsize = 24)\r\n",
    "    plt.savefig('highwords.jpg')\r\n",
    "    plt.show()\r\n",
    "    return word_counts\r\n",
    "\r\n",
    "\r\n",
    "\r\n",
    "if __name__ == '__main__':\r\n",
    "\r\n",
    "    stopwords=stopwordslist()\r\n",
    "\r\n",
    "    f = open(r\"comment/comment.txt\")\r\n",
    "    line = f.readline()\r\n",
    "    segments=[]\r\n",
    "    while line:\r\n",
    "        line = f.readline()\r\n",
    "        clear_line=clear_special_char(line)\r\n",
    "        seg_list= fenci(clear_line)\r\n",
    "        segments_list=movestopwords(seg_list,stopwords)\r\n",
    "        segments.extend(segments_list)\r\n",
    "    f.close()\r\n",
    "    drawcounts(segments)\r\n",
    "\r\n",
    "  "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": false
   },
   "source": [
    "## 情感分析\n",
    "\n",
    "对评论进行情感分析，并绘制饼图"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 92,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\u001b[33mWARNING: Skipping pyecharts as it is not installed.\u001b[0m\n",
      "Looking in indexes: https://pypi.mirrors.ustc.edu.cn/simple/\n",
      "Collecting pyecharts\n",
      "  Using cached https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/8b/87/d358d00c8e7837da835869afa34cf556dc743a20d92d67abe02529c7b1d8/pyecharts-1.7.1-py3-none-any.whl\n",
      "Requirement already satisfied: jinja2 in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from pyecharts) (2.10.1)\n",
      "Requirement already satisfied: prettytable in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from pyecharts) (0.7.2)\n",
      "Requirement already satisfied: simplejson in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from pyecharts) (3.17.0)\n",
      "Requirement already satisfied: MarkupSafe>=0.23 in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from jinja2->pyecharts) (1.1.1)\n",
      "Installing collected packages: pyecharts\n",
      "Successfully installed pyecharts-1.7.1\n"
     ]
    }
   ],
   "source": [
    "!pip uninstall -y pyecharts\r\n",
    "!pip install pyecharts\r\n",
    "\r\n",
    "# !pip install pyecharts==0.5.10 -i https://pypi.tuna.tsinghua.edu.cn/simple/ --trusted-host pypi.tuna.tsinghua.edu.cn"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 97,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "# from pyecharts import Pie\r\n",
    "# from pyecharts.charts.basic_charts.pie import Pie\r\n",
    "\r\n",
    "from pyecharts.charts import Pie\r\n",
    "from pyecharts import options as opts\r\n",
    "def draw_pie(data,labels):\r\n",
    "    \"\"\"\r\n",
    "    绘制饼图\r\n",
    "  \r\n",
    "    \"\"\"\r\n",
    "    data_pie = [list(i) for i in zip(labels,data)]\r\n",
    "\r\n",
    " # 创建实例对象\r\n",
    "    pie = Pie(init_opts=opts.InitOpts(width='1000px',height='600px'))\r\n",
    "    # 添加数据\r\n",
    "    pie.add(series_name=\"情感类型\",data_pair=data_pie)\r\n",
    "    # 设置全局项\r\n",
    "    pie.set_global_opts(title_opts=opts.TitleOpts(title=\"谢可寅好感分析\",pos_left='center',pos_top=20))\r\n",
    "    #设置每项数据占比\r\n",
    "    pie.set_series_opts(tooltip_opts=opts.TooltipOpts(trigger='item',formatter=\"{a} <br/> {b}:{c} ({d}%)\"))\r\n",
    "    pie.render(\"pie_charts.html\")\r\n",
    "\r\n",
    "\r\n",
    "\r\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 60,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Module senta_lstm already installed in /home/aistudio/.paddlehub/modules/senta_lstm\r\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\u001b[32m[2020-05-05 00:44:32,581] [    INFO] - Installing senta_lstm module\u001b[0m\n",
      "\u001b[32m[2020-05-05 00:44:32,617] [    INFO] - Module senta_lstm already installed in /home/aistudio/.paddlehub/modules/senta_lstm\u001b[0m\n",
      "\u001b[33m[2020-05-05 00:44:34,538] [ WARNING] - Parameter module_dir is deprecated, please use directory to specify the path\u001b[0m\n"
     ]
    }
   ],
   "source": [
    "!hub install senta_lstm\r\n",
    "senta = hub.Module(name=\"senta_lstm\")\r\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 98,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "total:2505.000000,pos:1206.000000,neg:1299.000000\n"
     ]
    }
   ],
   "source": [
    "if __name__ == '__main__':\r\n",
    "\r\n",
    "    f = open(r\"comment/clear_comment.txt\")\r\n",
    "    line = f.readline()\r\n",
    "    comments=[]\r\n",
    "    while line:\r\n",
    "        comments.append(line)\r\n",
    "        line = f.readline()\r\n",
    "\r\n",
    "    f.close()\r\n",
    "    input_dict = {\"text\": comments}\r\n",
    "    results = senta.sentiment_classify(data=input_dict,batch_size=5)\r\n",
    "    positive_num=0\r\n",
    "    negative_num=0\r\n",
    "    for result in results:\r\n",
    "        if result['sentiment_key'] == 'positive':\r\n",
    "            positive_num+=1\r\n",
    "        else:\r\n",
    "            negative_num+=1\r\n",
    "\r\n",
    "    print(\"total:%f,pos:%f,neg:%f\"%(len(results),positive_num,negative_num))\r\n",
    "    data=[positive_num,negative_num]\r\n",
    "    labels=['积极评论','消极评论']\r\n",
    "    draw_pie(data,labels)\r\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": false
   },
   "source": [
    "# 具体调用\n",
    "\n",
    "1. 生成标准选手的关键点划线图\n",
    "2. 生成测试选手的关键点划线图\n",
    "3. 评估测试选手主题曲实力\n",
    "4. 计算相似度均值并输出图片结果\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\u001b[32m[2020-05-04 21:35:38,167] [    INFO] - Installing stylepro_artistic module\u001b[0m\n",
      "\u001b[33m[2020-05-04 21:35:38,185] [ WARNING] - /home/aistudio/.paddlehub/modules/stylepro_artistic/module_desc.pb does not exist, the module will be reinstalled\u001b[0m\n",
      "\u001b[31m[2020-05-04 21:35:40,432] [   ERROR] -  \u001b[0m\n",
      "\u001b[31m[2020-05-04 21:35:40,433] [   ERROR] - %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\u001b[0m\n",
      "\u001b[31m[2020-05-04 21:35:40,434] [   ERROR] - %                                  %\u001b[0m\n",
      "\u001b[31m[2020-05-04 21:35:40,435] [   ERROR] - %  The version of PaddlePaddle or  %\u001b[0m\n",
      "\u001b[31m[2020-05-04 21:35:40,436] [   ERROR] - %  ===> PaddleHub can not match m  %\u001b[0m\n",
      "\u001b[31m[2020-05-04 21:35:40,436] [   ERROR] - %  ===>odule, please upgrade your  %\u001b[0m\n",
      "\u001b[31m[2020-05-04 21:35:40,437] [   ERROR] - %  ===> PaddlePaddle or PaddleHub  %\u001b[0m\n",
      "\u001b[31m[2020-05-04 21:35:40,438] [   ERROR] - %  ===> according to the form bel  %\u001b[0m\n",
      "\u001b[31m[2020-05-04 21:35:40,438] [   ERROR] - %  +-----------------------------  %\u001b[0m\n",
      "\u001b[31m[2020-05-04 21:35:40,439] [   ERROR] - %  ===>---+----------+-----------  %\u001b[0m\n",
      "\u001b[31m[2020-05-04 21:35:40,440] [   ERROR] - %  ===>-------+------------------  %\u001b[0m\n",
      "\u001b[31m[2020-05-04 21:35:40,440] [   ERROR] - %  |          \u001b[1;32mResourceName  %\u001b[0m\n",
      "\u001b[31m[2020-05-04 21:35:40,441] [   ERROR] - %  ===>\u001b[0m          | \u001b[1;32mVer  %\u001b[0m\n",
      "\u001b[31m[2020-05-04 21:35:40,441] [   ERROR] - %  ===>sion\u001b[0m  |   \u001b[1;32mPaddl  %\u001b[0m\n",
      "\u001b[31m[2020-05-04 21:35:40,442] [   ERROR] - %  ===>ePaddle\u001b[0m   |    \u001b[1;32m  %\u001b[0m\n",
      "\u001b[31m[2020-05-04 21:35:40,443] [   ERROR] - %  ===>PaddleHub\u001b[0m     |         %\u001b[0m\n",
      "\u001b[31m[2020-05-04 21:35:40,444] [   ERROR] - %  +-----------------------------  %\u001b[0m\n",
      "\u001b[31m[2020-05-04 21:35:40,445] [   ERROR] - %  ===>---+----------+-----------  %\u001b[0m\n",
      "\u001b[31m[2020-05-04 21:35:40,446] [   ERROR] - %  ===>-------+------------------  %\u001b[0m\n",
      "\u001b[31m[2020-05-04 21:35:40,446] [   ERROR] - %  |       \u001b[1;33mstylepro_artist  %\u001b[0m\n",
      "\u001b[31m[2020-05-04 21:35:40,447] [   ERROR] - %  ===>ic\u001b[0m        |  1.0.0   |  %\u001b[0m\n",
      "\u001b[31m[2020-05-04 21:35:40,448] [   ERROR] - %  ===>      >1.6.2      |      >  %\u001b[0m\n",
      "\u001b[31m[2020-05-04 21:35:40,449] [   ERROR] - %  ===>1.6.0      |                %\u001b[0m\n",
      "\u001b[31m[2020-05-04 21:35:40,450] [   ERROR] - %  +-----------------------------  %\u001b[0m\n",
      "\u001b[31m[2020-05-04 21:35:40,451] [   ERROR] - %  ===>---+----------+-----------  %\u001b[0m\n",
      "\u001b[31m[2020-05-04 21:35:40,452] [   ERROR] - %  ===>-------+------------------  %\u001b[0m\n",
      "\u001b[31m[2020-05-04 21:35:40,453] [   ERROR] - %                                  %\u001b[0m\n",
      "\u001b[31m[2020-05-04 21:35:40,454] [   ERROR] - %                                  %\u001b[0m\n",
      "\u001b[31m[2020-05-04 21:35:40,455] [   ERROR] - %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\u001b[0m\n"
     ]
    },
    {
     "ename": "RuntimeError",
     "evalue": "The version of PaddlePaddle or PaddleHub can not match module, please upgrade your PaddlePaddle or PaddleHub according to the form below.\n+--------------------------------+----------+------------------+------------------+\n|          \u001b[1;32mResourceName\u001b[0m          | \u001b[1;32mVersion\u001b[0m  |   \u001b[1;32mPaddlePaddle\u001b[0m   |    \u001b[1;32mPaddleHub\u001b[0m     |\n+--------------------------------+----------+------------------+------------------+\n|       \u001b[1;33mstylepro_artistic\u001b[0m        |  1.0.0   |      >1.6.2      |      >1.6.0      |\n+--------------------------------+----------+------------------+------------------+\n",
     "output_type": "error",
     "traceback": [
      "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[0;31mRuntimeError\u001b[0m                              Traceback (most recent call last)",
      "\u001b[0;32m<ipython-input-59-c5bafd6fd72f>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[1;32m      8\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m      9\u001b[0m     \u001b[0;31m## 转换风格\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 10\u001b[0;31m     \u001b[0mchange_style\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mget_img_list\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'work/aq/bgres/'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m'work/aq/style_img/'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m     11\u001b[0m     \u001b[0mcomp_video\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'work/aq/style_img/'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m     12\u001b[0m     \u001b[0maddMusic\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'video/style_img.mp4'\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mgetMusic\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'video/aq_base4.mp4'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m'video/voice_frame2.mp4'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m<ipython-input-58-caab13c84332>\u001b[0m in \u001b[0;36mchange_style\u001b[0;34m(img_list, output_dir)\u001b[0m\n\u001b[1;32m      5\u001b[0m     \u001b[0moutput_dir\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0m图片输出目录\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m      6\u001b[0m     \"\"\"\n\u001b[0;32m----> 7\u001b[0;31m     \u001b[0mstylepro_artistic\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mhub\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mModule\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mname\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m\"stylepro_artistic\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m      8\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m      9\u001b[0m     result = stylepro_artistic.style_transfer(\n",
      "\u001b[0;32m/opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages/paddlehub/module/module.py\u001b[0m in \u001b[0;36m__new__\u001b[0;34m(cls, name, directory, module_dir, version)\u001b[0m\n\u001b[1;32m    142\u001b[0m         self._serving_func_name = self._get_func_name(self.__class__,\n\u001b[1;32m    143\u001b[0m                                                       _module_serving_func)\n\u001b[0;32m--> 144\u001b[0;31m         \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_directory\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mdirectory\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    145\u001b[0m         \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_initialize\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    146\u001b[0m         \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_is_initialize\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;32mTrue\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m/opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages/paddlehub/module/module.py\u001b[0m in \u001b[0;36minit_with_name\u001b[0;34m(cls, name, version)\u001b[0m\n\u001b[1;32m    211\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    212\u001b[0m     \u001b[0;34m@\u001b[0m\u001b[0mproperty\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 213\u001b[0;31m     \u001b[0;32mdef\u001b[0m \u001b[0mauthor\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    214\u001b[0m         \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__class__\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_author\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    215\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;31mRuntimeError\u001b[0m: The version of PaddlePaddle or PaddleHub can not match module, please upgrade your PaddlePaddle or PaddleHub according to the form below.\n+--------------------------------+----------+------------------+------------------+\n|          \u001b[1;32mResourceName\u001b[0m          | \u001b[1;32mVersion\u001b[0m  |   \u001b[1;32mPaddlePaddle\u001b[0m   |    \u001b[1;32mPaddleHub\u001b[0m     |\n+--------------------------------+----------+------------------+------------------+\n|       \u001b[1;33mstylepro_artistic\u001b[0m        |  1.0.0   |      >1.6.2      |      >1.6.0      |\n+--------------------------------+----------+------------------+------------------+\n"
     ]
    }
   ],
   "source": [
    "if __name__ == \"__main__\":\r\n",
    "\r\n",
    "    # 生成标准选手的关键点划线图\r\n",
    "    CutVideo2Image('video/aq_base4.mp4','work/aq/base/')\r\n",
    "    delete_bg('work/aq/base/')\r\n",
    "    add_white_bg('h_out/','work/aq/bgout/','work/aq/bgres/')\r\n",
    "    count_frame = 0\r\n",
    "    GetOutputPose('work/aq/bgres/','work/aq/black_frame/','work/aq/pose_frame/')\r\n",
    "  \r\n",
    "    # 生成测试选手的关键点划线图\r\n",
    "    CutVideo2Image('video/xky_base1.mp4','work/test/base/')\r\n",
    "    count_frame = 0\r\n",
    "    GetOutputPose('work/test/base/','work/test/black_frame/','work/test/pose_frame/')\r\n",
    "\r\n",
    "    # 评估测试选手主题曲实力\r\n",
    "    test_path = 'work/test/black_frame/'\r\n",
    "    standard_path='work/aq/black_frame/'\r\n",
    "    cal=[]\r\n",
    "    num = os.listdir(test_path)\r\n",
    "    for i in range(0,len(test_path)-1): \r\n",
    "        imgobj1 = cv2.imread(test_path+str(i)+'.jpg')\r\n",
    "        imgobj2 = cv2.imread(standard_path+str(i)+'.jpg')\r\n",
    "        cal.append(calculate(imgobj1,imgobj2))\r\n",
    "\r\n",
    "    # 计算均值并输出图片结果\r\n",
    "    power_val = '实力评估值为：%3.2f'%(np.mean(cal))\r\n",
    "    draw_text('work/test/base/100.jpg',power_val,'result_test.jpg')\r\n",
    "\r\n",
    "\r\n",
    "\r\n",
    "\r\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": false
   },
   "source": [
    "## 转换水墨画风格"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": false
   },
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Video cut finish, all 186 frame\n",
      "imge size:x is 352,y is 640\n",
      "一共有184帧图片要合成\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "chunk:  71%|███████   | 97/137 [00:00<00:00, 285.31it/s, now=None]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Moviepy - Building video video/voice_frame2.mp4.\n",
      "MoviePy - Writing audio in voice_frame2TEMP_MPY_wvf_snd.mp3\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "                                                                  \n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "MoviePy - Done.\n",
      "Moviepy - Writing video video/voice_frame2.mp4\n",
      "\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "t:  30%|███       | 56/184 [00:00<00:00, 551.63it/s, now=None]                                                               \n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Moviepy - Done !\n",
      "Moviepy - video ready video/voice_frame2.mp4\n"
     ]
    }
   ],
   "source": [
    "if __name__ == \"__main__\":\r\n",
    "      ## 转换风格\r\n",
    "    change_style(get_img_list('work/aq/bgres/'),'work/aq/style_img/')\r\n",
    "    comp_video('work/aq/style_img/')\r\n",
    "    addMusic('video/style_img.mp4',getMusic('video/aq_base4.mp4'),'video/voice_frame2.mp4')"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "PaddlePaddle 1.7.1 (Python 3.5)",
   "language": "python",
   "name": "py35-paddle1.2.0"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.4"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 1
}
